require('dotenv').config({
  path: `.env.${process.env.NODE_ENV}`
});
require('module-alias/register');
// 同步数据库
require("./sync.db")
const path = require('path');
// 引入express
const express = require('express');
// 引入cors
const cors = require('cors');
// 解析请求体
const bodyParser = require('body-parser');
// 引入Helmet（设置常见的请求头免受Web漏洞的影响）
const helmetConfig = require('@/config/helmet.config')
// token中间件
const { authenticateJWT } = require('@/middleware/jwt.middleware')
// 错误中间件
const errorHandler = require('@/middleware/err.middleware')
// 引入路由
const mainRoutes = require('@/routes');

// 工具函数
const getLocalIP = require('@/utils/getLocalIP')
const app = express();
const PORT = process.env.PORT || 3000;
const localIP = getLocalIP();

// 使用Helmet配置中间件
app.use(helmetConfig);

// 允许所有跨域访问
app.use(cors());

// 使用 body-parser 中间件解析 application/x-www-form-urlencoded 格式的请求体
app.use(bodyParser.urlencoded({ extended: true }));

// 或者指定允许的源
// const corsOptions = {
//   origin: 'http://example.com', // 只允许 example.com 域名访问
//   optionsSuccessStatus: 200 // 一些旧浏览器（如 IE11）会期望返回 200 而不是默认的 204
// };
// app.use(cors(corsOptions));

// 以json格式接收数据并解析URL编码
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

// 项目静态文件
app.use(express.static('public'));

// 使用路由暴露出doc.html 使用时添加请求参数方便后面更新资源
app.get('/doc', (req, res) => {
  // 单位是秒 设置一年 24 * 60 * 60 * 365 = 31536000
  res.set('Cache-Control', 'public, max-age=31536000');
  res.sendFile(__dirname + '/public/doc.html');
});

// 用户使用静态文件 纯静态资源需要更改则重新上传文件来使用
app.use('/static', express.static(path.join(__dirname, 'static'), {
  setHeaders: function (res, path) {
    // 单位是秒 设置一年 24 * 60 * 60 * 365 = 31536000
    res.set('Cache-Control', 'public, max-age=31536000');
  }
}));

// token验证
app.use(authenticateJWT);
// 路由
app.use('/', mainRoutes);

// 错误中间件
app.use(errorHandler)

// Start the server
let http =
  `server to http://localhost:${PORT}
server to http://${localIP}:${PORT}
SwaggerUI to http://localhost:${PORT}/swagger
SwaggerUI to http://${localIP}:${PORT}/swagger
knife4j to http://localhost:${PORT}/doc?v=1
knife4j to http://${localIP}:${PORT}/doc?v=1`
app.listen(PORT, async () => {
  console.log(http);
  // // 开发环境自动打开浏览器
  // if (process.env.NODE_ENV === 'development') {
  //   const { default: open } = await import('open');
  //   open(`http://localhost:${PORT}/doc`)
  // }
});